package com.study.compose.coroutines

import kotlinx.coroutines.*

/**
 * 参考：http://www.kotlincn.net/docs/reference/coroutines/basics.html
 *
 * kotlin基础库只提供了一些最基本的协程api
 * kotlinx.coroutines 是由 JetBrains 基于协程基础库开发的功能丰富的协程库，并没有包含在kotlin的基础库里面
 * 这些东西属于现学现卖，但是确实相比以往的线程有其独到之处，所以就迫不及待的想给大家分享一下，难免会出现一些理解的错误
 *
 * 协程是轻量级的线程，具体什么是轻量级的线程，下面是Android developer网站上的解释：
 * 轻量：您可以在单个线程上运行多个协程，因为协程支持挂起，不会使正在运行协程的线程阻塞。挂起比阻塞节省内存，且支持多个并行操作。
 * 内存泄漏更少：使用结构化并发机制在一个作用域内执行多项操作。
 * 内置取消支持：取消操作会自动在运行中的整个协程层次结构内传播。
 * Jetpack 集成：许多 Jetpack 库都包含提供全面协程支持的扩展。某些库还提供自己的协程作用域，可供您用于结构化并发。
 *
 * 本示例演示一个简单的协程的使用
 */
fun main() {
    /**
     * GlobalScope：全局作用域，也就是他的生命周期很长
     * launch声明协程代码块，在launch代码块中可以执行挂起函数,就是被suspend标记的函数，被suspend标记的函数
     * 只能放在协程代码块中和其他挂起函数中执行
     */
    GlobalScope.launch {
        //delay是一个挂起函数，是非阻塞式的，至于什么是阻塞式什么是非阻塞式？目前不太清楚
        delay(1000)
        println("world")
        println("当前线程launch：${Thread.currentThread().name}")
    }

    println("hello,")

    println("当前线程main：${Thread.currentThread().name}")

    /**
     * 阻塞线程两秒，不让jvm结束运行，
     *
     * runBlocking也是一种协程构造器，不同的是主线程会阻塞等待直到runBlocking执行完毕
     */
//    runBlocking {
//        // 等待withContext(Dispatchers.IO)的执行
//        delay(2000)
//        println("当前线程runBlocking：${Thread.currentThread().name}")
//    }
}